package com.yuhanginfo.modules.web.service;

import java.util.Collection;
import java.util.List;

import org.apache.shiro.session.Session;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.yuhanginfo.common.security.Digests;
import com.yuhanginfo.common.security.shiro.session.SessionDAO;
import com.yuhanginfo.common.service.BaseService;
import com.yuhanginfo.common.utils.Encodes;
import com.yuhanginfo.modules.web.util.WebUserUtils;
import com.yuhanginfo.modules.web.dao.WebAreaDao;
import com.yuhanginfo.modules.web.entity.WebArea;
import com.yuhanginfo.modules.web.entity.WebYongUser;

/**
 * 系统管理，安全相关实体的管理类,包括用户、角色、菜单.
 * @author YuHangInfo
 * @version 2013-12-05
 */
@Service
@Transactional(readOnly = true)
public class WebSystemService extends BaseService implements InitializingBean {
	
	public static final String HASH_ALGORITHM = "SHA-1";
	public static final int HASH_INTERATIONS = 1024;
	public static final int SALT_SIZE = 8;
	@Autowired
	private SessionDAO sessionDao;
	@Autowired 
	private WebAreaDao areaDao;
	
	public SessionDAO getSessionDao() {
		return sessionDao;
	}

	//-- User Service --//
	
	/**
	 * 获取用户
	 * @param id
	 * @return
	 */
	public WebYongUser getCacheUser(String id) {
		return WebUserUtils.getYong(id);
	}

	/**
	 * 获取用户
	 * @param id
	 * @return
	 */
	public WebYongUser getUser(String id) {
		return WebUserUtils.getNoCacheYong(id);
	}
	

	/**
	 * 根据登录名获取管理员用户
	 * @param loginName
	 * @return
	 */
	public WebYongUser getUserByLoginName(String loginName) {
		return WebUserUtils.getByYongLoginName(loginName);
	}
	
	
	/**
	 * 根据登录名获取一般用户
	 * @param loginName
	 * @return
	 */
	public WebYongUser getYongUserByLoginName(String loginName) {
		return WebUserUtils.getByYongLoginName(loginName);
	}
	
	@Transactional(readOnly = false)
	public void updateUserInfo(WebYongUser user) {
		user.preUpdate();
		// 清除用户缓存
		WebUserUtils.clearWebCache(user);
	}
	
	
	@Transactional(readOnly = false)
	public void updatePasswordById(String id, String loginName, String newPassword) {
		WebYongUser user = new WebYongUser(id);
		user.setPassword(entryptPassword(newPassword));
		// 清除用户缓存
		user.setLoginName(loginName);
		WebUserUtils.clearWebCache(user);
	}
	
	@Transactional(readOnly = false)
	public void updateUserLoginInfo(WebYongUser user) {
		// 保存上次登录信息
//		// 更新本次登录信息
	}
	
	/**
	 * 生成安全的密码，生成随机的16位salt并经过1024次 sha-1 hash
	 */
	public static String entryptPassword(String plainPassword) {
		String plain = Encodes.unescapeHtml(plainPassword);
		byte[] salt = Digests.generateSalt(SALT_SIZE);
		byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);
		return Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword);
	}
	
	/**
	 * 验证密码
	 * @param plainPassword 明文密码
	 * @param password 密文密码
	 * @return 验证成功返回true
	 */
	public static boolean validatePassword(String plainPassword, String password) {
		String plain = Encodes.unescapeHtml(plainPassword);
		byte[] salt = Encodes.decodeHex(password.substring(0,16));
		byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);
		return password.equals(Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword));
	}
	
	/**
	 * 获得活动会话
	 * @return
	 */
	public Collection<Session> getActiveSessions(){
		return sessionDao.getActiveSessions(false);
	}

	
	///////////////// Synchronized to the Activiti //////////////////
	
	// 已废弃，同步见：ActGroupEntityServiceFactory.java、ActUserEntityServiceFactory.java

	/**
	 * 是需要同步Activiti数据，如果从未同步过，则同步数据。
	 */
	public void afterPropertiesSet() throws Exception {
		//暂时为空
	}

	
	///////////////// Synchronized to the Activiti end //////////////////
	//查询所有销售人员列表

	
	//查询所有区域
	public List<WebArea> findArea(String userId){
		return areaDao.findAreaByUserId(userId);
	}
	//查询所有区域
	public List<WebArea> findArea(){
		return areaDao.areaStoreList();
	}

	/**
	 * 获取Key加载信息
	 */
	public static boolean printKeyLoadMessage(){
		StringBuilder sb = new StringBuilder();
		sb.append("\r\n======================================================================\r\n");
		sb.append("\r\n    欢迎使用 极配正品电商平台  - Powered By http://yuhanginfo.com\r\n");
		sb.append("\r\n======================================================================\r\n");
		return true;
	}
}
